/*解决思路
1、创建WebScoket socket的url地址可配置
2、浏览器收到服务器的数据用回调抛出
3、监听生命周期
4、提供手动触发的方式

其他待确认问题：
1、服务断开是否需要重连？
2、向服务器发送数据的格式
  拟发送数据格式
  {
    path:"",//路由地址或其他唯一表示符号
    data:[],//需要后台处理的数据
    msg:''//其他需要处理的消息
  }
*/

//webSocket连接建立
export function WebSocketConnect(parameter) {
  //webSocket对象
  let ws,
    flag = false
  /*"#SKT_METHOD#":{
       "PONG":"心跳检测",
		   "BIND_USER":"绑定用户",
		   "SEND_MSG":"发送消息"
  }*/
  const SKT_METHOD = ['PONG', 'BIND_USER', 'SEND_MSG']
  let dataParameter = {
    '#SKT_METHOD#': '',
    '#SKT_TOKEN#': '11111',
    '#SKT_FM_USER_ID#': 'qgc',
    '#SKT_TO_USER_ID#': 'qgc',
    '#SKT_FM_RESOURCE#': 'web',
    '#SKT_TO_RESOURCE#': 'web',
    '#DATA#': parameter.data || [''],
  }
  //参数封装
  const _parameter = {
    //URL建立
    url: parameter.url || '192.168.3.120:18083/ws',
    //默认open后发送数据
    isDefaultSendData: parameter.isDefaultSendData || true,
    /*
    发送的数据，默认已经封装成响应式；如果后续有问题再调整
    数据格式有待确定
    */
    data: dataParameter,
    //webSocket连接建立成功
    onOpen: function (event) {
      console.log('webSocket连接建立成功')
      //默认发送一次数据
      if (this.isDefaultSendData) {
        dataParameter['#SKT_METHOD#'] = SKT_METHOD[1]
        dataParameter['#DATA#'] = [SKT_METHOD[1]]
        ws && ws.send(JSON.stringify(dataParameter))
      }
      //建立成功的回调
      parameter.onOpen && parameter.onOpen(event)
    },
    //webSocket客户端接收数据成功
    onSuccess: function (event) {
      console.log('服务端发送数据成功')
      //数据接收成功的回调
      parameter.onSuccess && parameter.onSuccess(event.data)
    },
    //WebSocket连接关闭
    onClose: function (event) {
      console.log('WebSocket连接关闭')
      //重置状态
      flag = true
      //连接关闭的回调
      parameter.onClose && parameter.onClose(event)
    },
    //WebSocket连接发生异常
    onError: function (event) {
      console.log('WebSocket连接发生异常')
      parameter.onError && parameter.onError(event)
      //重置状态
      flag = true
      //设置重联
      reConnect()
    },
  }

  //心跳检测
  const heartCheck = {
    timeout: 3000,
    timeoutObj: null,
    serverTimeoutObj: null,
    start: function () {
      console.log('start-heart-check')
      var self = this
      this.timeoutObj && clearTimeout(this.timeoutObj)
      this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj)
      this.timeoutObj = setTimeout(function () {
        //这里发送一个心跳，后端收到后，返回一个心跳消息，
        dataParameter['#SKT_METHOD#'] = SKT_METHOD[0]
        dataParameter['#DATA#'] = 'PONG'
        ws && ws.send(JSON.stringify(dataParameter))
        self.serverTimeoutObj = setTimeout(function () {
          ws && ws.close()
          reConnect()
        }, self.timeout)
      }, this.timeout)
    },
  }

  //创建WebSocket
  function creatWebsocket() {
    try {
      //WebSocket建立连接
      ws = new WebSocket('ws://' + _parameter.url)
      //WebSocket连接建立成功
      ws.onopen = function (event) {
        heartCheck.start()
        _parameter.onOpen(event)
      }

      //WebSocket服务端发送的信息
      ws.onmessage = function (event) {
        heartCheck.start()
        _parameter.onSuccess(event)
      }

      //Websocket关闭时触发
      ws.onclose = function (event) {
        _parameter.onClose(event)
      }

      //Websocket异常是触发
      ws.onerror = function (event) {
        _parameter.onError(event)
      }
    } catch (e) {
      console.log(e)
      reConnect()
    }
  }

  //重新连接
  function reConnect() {
    if (!flag) return
    flag = false
    setTimeout(function () {
      console.log('重新连接websocket')
      creatWebsocket()
      flag = true
    }, 4000)
  }

  //调用执行一遍数据
  creatWebsocket()

  return {
    //WebSocket发送数据
    sendData: function (data) {
      dataParameter['#SKT_METHOD#'] = SKT_METHOD[2]
      dataParameter['#DATA#'] = data
      //默认数据是响应式
      ws && ws.send(JSON.stringify(dataParameter))
    },
    //WebSocket手动触发关闭
    close: function () {
      ws && ws.close()
    },
    //可以手动触发重联
    reConnect: function () {
      flag = true
      reConnect()
    },
  }
}
